#include <iostream>
#include <unistd.h>
#include <cstring>
#include <cstdio>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string>
using namespace std;


int main()
{
    // 1.创建管道
    int pipefd[2] = {0};
    int n = pipe(pipefd);
    assert(n != -1);
    (void)n;//表示用了局部变量，release下没有使用定义的变量会有警告

    // 2.创建子进程
    pid_t id = fork();

    assert(id != -1);//创建子进程失败

    if(id == 0)
    {
        //子进程
        //关闭子进程不需要的fd，也就是写入端口
        close(pipefd[1]);
        char buffer[1024*8];
        while(1)
        {
            // sleep(10);
            //写入的一方，fd没有关闭，如果有数据就读，没有数据就等
            //写入的一方，fd关闭了，read会返回0，表示读到了文件的结尾
            ssize_t s = read(pipefd[0],buffer,sizeof(buffer));
            if(s > 0)
            {
                buffer[s] = 0;
                cout<< "child get a message[" << getpid() << "] Father: " << buffer << endl;
            }
            else if( s == 0)
            {
                cout << "File End" << endl;
                break;
            }
        }

        exit(0);
        
    }

    //父进程
    //3.1关闭父进程不需要的端口，也就是读入端口
    close(pipefd[0]);
    string message = "我是父进程，我正在给你发信息";
    int count = 0;
    char send_buffer[1024*8];
    while(1)
    {
        //3.2构建一个变化的字符串
        snprintf(send_buffer,sizeof(send_buffer), "%s[%d] : %d",
                message.c_str(), getpid(), count++);
        //3.3写入
        write(pipefd[1],send_buffer,strlen(send_buffer));
        cout<<count << endl;
        //3.4故意sleep
        sleep(1);
        if(count == 10)
        {
            cout << "write quit(Father)" << endl;
            break;
        }
    }

    close(pipefd[1]);
    pid_t ret = waitpid(id,nullptr,0);
    assert(ret > 0);
    (void)ret;
    
    return 0;
}
